//将 x 减到 0 的最小操作数
class Solution {
public:
    int minOperations(vector<int>& nums, int x) 
    {
        //将思路逆转过来
        //求连续的 最长的 和为 sum-x的子数组长度
        //再用nums.size()-长度即可
        int sum=0;
        int n=nums.size();
        for(auto e:nums)
        {
            sum+=e;
        }
        int target=sum-x;
        if(target<0) return -1;
        int tmp=0;
        int length=-1;
        for(int l=0,r=0;r<n;r++)
        {
            tmp+=nums[r];
            while(tmp > target )
            {
                tmp-=nums[l++];
            }
            if(tmp==target) length=max(length,r-l+1);
        }
        if(length==-1) return -1;
        else return n-length;

    }
};
//无重复字符的最长子串

class Solution {
public:
    int lengthOfLongestSubstring(string s) 
    {
        unordered_map<char,int>hash;//字符,出现次数
        int l=0,r=0,n=s.size();
        int res=0;
        for(r=0;r<n;r++)
        {
            hash[s[r]]++;
            while(hash[s[r]]>1)
            {
                hash[s[l++]]--;
            }
            res=max(res,r-l+1);
        }
        return res;
    }
};
//长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int res=INT_MAX;
        int sum=0;
        int l=0,r=0,n=nums.size();
        for(r=0;r<n;r++)
        {
            sum+=nums[r];
            while(sum>=target)
            {
                res=min(res,r-l+1);
                sum-=nums[l++];
            }
        }
        return res==INT_MAX?0:res;

    }
};
//最大连续1的个数 III

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) 
    {
        //相当于求最长的 最多含k个零 的子数组
        int l=0,r=0,res=0,n=nums.size();
        int flag=0;
        for(r=0;r<n;r++)
        {
            if(nums[r]==0) flag++;
            while(flag > k)
            {
                if(nums[l++]==0) flag--;
            }
            res=max(res,r-l+1);
        }
        return res;
    }
};